import { reactive, ref, unref } from 'vue'
import { ElMessageBox, ElMessage } from 'element-plus'
import { ERR_OK } from 'config/statusCode'
import { isArray } from 'utils/validate'
import { deepClone } from '@/utils/index'
import { useI18n } from 'vue-i18n'
/* eslint-disable */
export function useBasicData(option, rowKey) {
  const { t } = useI18n() // 中英文
  const listFun = option.listFun || null // 默认的请求列表数据（一般默认有分页）
  const delFun = option.delFun || null
  const enableFunc = option.enableFunc || null
  const disableFunc = option.disableFunc || null

  // 额外的业务的逻辑
  const otherListFunc = option.otherListFunc || null // 其他的列表数据
  const saveFunc = option.saveFunc || null // 右侧弹框确认选择/保存数据的接口
  const saveOtherFunc = option.saveOtherFunc || null // 右侧弹框确认选择/保存数据的接口（接受其他另外的接口）-是否存在多个报错接口

  // 请求接口的基本参数
  const defaultParams = reactive({
    page: 1,
    size: 10
  })

  // 多选数据
  const selectionRowData = ref([]) // 所有的包含跨页数据

  const selectedRowRef = ref([])

  const tableRef = ref(null)
  const tableRefCom = ref(null)
  // 表格数据
  const tableData = ref([])

  // 表格加载状态
  const loading = ref(true)

  // 表格总条数
  const total = ref(0)

  // 是否展示弹窗
  const dialogVisible = ref(false)

  // 弹窗标题
  const dialogTitle = ref('')

  // 组件名称
  const comName = ref('')

  // 弹窗宽度
  const dialogWidth = ref('')

  // 传送表格行的数据
  const rowData = ref(null)

  // 传送表格行的数据（弹框特殊处理的参数）
  const optionsData = ref(null)

  // 需要传给后端的其他参数
  const otherParams = ref({})

  const confirmLoading = ref(false) // 确认选择/保存数据的按钮

  // 是否允许其他接口请求替换（仅适用于表格列表查询）
  const isAcceptUrl = ref(false)
  /**
   * 表格选择事件
   *
   * @param selectRow
   */
  function onRowClick(selectedRow, tableElRef) {
    tableRef.value = unref(tableElRef)
    if (!selectedRow || selectedRow.length == 0) {
      selectedRowRef.value = []
    }
    selectedRowRef.value = selectedRow
    getCacheRowkeys()
  }
  // 跨页选择
  function getCacheRowkeys() {
    // 标识当前行的唯一键的名称
    let idKey = rowKey ? rowKey : 'id'
    // 如果总记忆中还没有选择的数据，那么就直接取当前页选中的数据，不需要后面一系列计算
    if (selectionRowData.value.length <= 0) {
      selectionRowData.value = selectedRowRef.value
      return
    }
    // 总选择里面的key集合
    let selectAllIds = []
    selectionRowData.value.forEach((row) => {
      selectAllIds.push(row[idKey])
    })
    let selectIds = []
    // 获取当前页选中的id
    selectedRowRef.value.forEach((row) => {
      selectIds.push(row[idKey])
      // 如果总选择里面不包含当前页选中的数据，那么就加入到总选择集合里
      if (selectAllIds.indexOf(row[idKey]) < 0) {
        selectionRowData.value.push(row)
      }
    })
    let noSelectIds = []
    // 得到当前页没有选中的id
    tableData.value.forEach((row) => {
      if (selectIds.indexOf(row[idKey]) < 0) {
        noSelectIds.push(row[idKey])
      }
    })
    noSelectIds.forEach((id) => {
      if (selectAllIds.indexOf(id) >= 0) {
        for (let i = 0; i < selectionRowData.value.length; i++) {
          if (selectionRowData.value[i][idKey] == id) {
            // 如果总选择中有未被选中的，那么就删除这条
            selectionRowData.value.splice(i, 1)
            break
          }
        }
      }
    })
  }

  // 表格展示条目改变时候重置基本参数
  function sizeChange(val) {
    getCacheRowkeys()
    loading.value = true
    defaultParams.page = 1
    defaultParams.size = val
  }

  // 表格分页改变时候重置基本参数
  function currentChange(val) {
    getCacheRowkeys()
    loading.value = true
    defaultParams.page = val
  }

  // 删除多选
  /**
   * @param {Object} callBack
   * @param {Object} config {
        noDataText?: string // 没有选中数据时的提示
        text?: string // 删除前的提示
        hiddenVerify?: boolean // 是否隐藏前置判断
      }
   */

  function handleData(callBack, config) {
    if (!selectionRowData.value.length && config && !config.hiddenVerify) {
      ElMessage.warning((config && config.noDataText) || t('keys.please_delete_selectedData_tips'))
      return
    }
    ElMessageBox.confirm((config && config.text) || t('keys.isOr_delete_selectedData_tips'), t('keys.tips'), {
      confirmButtonText: t('keys.ok'),
      cancelButtonText: t('keys.cancel'),
      type: 'warning'
    }).then(async () => {
      await callBack()
    })
  }

  // 复选框选中事件
  function handleSelectionChange(rows, tableElRef) {
    tableRef.value = unref(tableElRef)
    selectedRowRef.value = rows
    getCacheRowkeys()
  }

  // 改变弹窗dialogVisible
  function toggleVisible(val = false) {
    dialogVisible.value = val
  }
  // 业务弹框数据的——确认选择/保存（此方法适用-表格只有单选/多选，只有搜索条件的业务）
  const setConfirmData = async () => {
    if (!selectionRowData.value.length) {
      ElMessage.warning(t('keys.please_select_table_line'))
      return
    }
    let ids = selectionRowData.value.map((v) => {
      return v.id
    })
    let apiR = isAcceptUrl.value ? saveOtherFunc : saveFunc
    const res = await apiR(ids, otherParams.value)
    if (res.code == ERR_OK) {
      responseBack(res, t('keys.save'), ids)
    }
  }

  // 以下是业务逻辑混入
  // 请求数据
  async function getList(res) {
    let data = res ? deepClone(res) : res
    try {
      // 特殊处理日期区间数据
      if (data && JSON.stringify(data) != '{}') {
        if (data.hasOwnProperty('createTime')) {
          if (data.createTime.length > 0) {
            data.sendStartTime = data.createTime[0] + ' 00:00:00'
            data.sendEndTime = data.createTime[1] + ' 23:59:59'
            delete data.createTime
          } else {
            data.sendStartTime = ''
            data.sendEndTime = ''
            delete data.createTime
          }
        } else if (data.hasOwnProperty('publishTime')) {
          if (data.publishTime.length > 0) {
            data.publishTimeStart = data.publishTime[0] + ' 00:00:00'
            data.publishTimeEnd = data.publishTime[1] + ' 23:59:59'
            delete data.publishTime
          } else {
            data.publishTimeStart = ''
            data.publishTimeEnd = ''
            delete data.publishTime
          }
        }
      }
      let apiR = isAcceptUrl.value ? otherListFunc : listFun
      const res = await apiR(Object.assign(otherParams.value, data || {}, defaultParams))
      if (res.code == ERR_OK) {
        if (res.data.pageNum) {
          tableData.value = res.data.list || []
          total.value = res.data.total || 0
        }
        if (isArray(res.data)) {
          tableData.value = res.data || []
        }
      }
      loading.value = false
    } finally {
      loading.value = false
    }
  }

  // 查询
  function searchSubmit(data) {
    clearSelectionKeys()
    // 该方法重置了一些默认参数
    currentChange(1)
    getList(data)
  }
  function clearSelectionKeys() {
    if (tableRef.value) {
      selectedRowRef.value = []
      selectionRowData.value = []
      tableRef.value.clearSelection()
      tableRefCom.value.resetTableSelect()
    }
  }
  // 重置
  function resetSubmit(data) {
    tableRefCom.value.resetTableSelect()
    // 用于多选表格，清空用户的选择
    clearSelectionKeys()
    currentChange(1)
    getList(data)
  }

  // 展示多少条
  function handleSizeChange(val) {
    // 该方法重置了一些默认参数
    sizeChange(val)
    getList()
  }

  // 展示第几页
  function handleCurrentChange(val) {
    // 该方法重置了一些默认参数
    currentChange(val)
    getList()
  }

  // 单个删除（ID不一致，传参数直接传根据业务传对应的主键ID）
  async function deletePopConfirm(id) {
    let ids = [id]
    const res = await delFun(ids)
    if (res.code == ERR_OK) {
      responseBack(res, t('keys.delete'), ids)
    }
  }
  // 批量删除
  function bacthDels(callback) {
    handleData(
      async () => {
        let ids = selectionRowData.value.map((v) => {
          return v[rowKey]
        })
        const res = await delFun(ids)
        if (res.code == ERR_OK) {
          clearSelectionKeys()
          responseBack(res, t('keys.delete'), ids, callback)
        }
      },
      {
        hiddenVerify: false,
        noDataText: t('keys.please_select_table_line'),
        text: t('keys.confirmSelectedDeleteLineStrip') + `${selectionRowData.value.length}` + t('keys.StripBar')
      }
    )
  }
  // 批量启用/禁用
  function batchDisableEnable(status, callback) {
    let desc = status == 1 ? t('keys.Enable') : t('keys.Disable')
    handleData(
      async () => {
        let apiR = status == 1 ? enableFunc : disableFunc
        let ids = selectionRowData.value.map((v) => {
          // return v.id
          return v
        })
        const res = await apiR(ids)
        if (res.code == ERR_OK) {
          clearSelectionKeys()
          responseBack(res, desc, ids, callback)
        }
      },
      {
        hiddenVerify: false,
        noDataText: t('keys.please_select_table_line'),
        text: t('keys.confirmSelectedDeleteLineStrip') + `${selectionRowData.value.length}` + t('keys.StripBar')
      }
    )
  }
  // single （是否是单个）
  const disableEnableConfirm = async (item) => {
    let desc = status == 1 ? t('keys.Enable') : t('keys.Disable')
    // let ids = [item.id]
    let ids = [item]
    let apiR = item.enabledFlag ? disableFunc : enableFunc
    const res = await apiR(ids)
    if (res.code == ERR_OK) {
      responseBack(res, desc, ids)
    }
  }
  // 删除、停启用接口提示及回调
  function responseBack(res, desc, ids) {
    ElMessage.success(`${desc}` + t('keys.oper_succeeded'))
    const page =
      total.value % defaultParams.size === ids.length || defaultParams.size === 1
        ? defaultParams.page > 1
          ? defaultParams.page - 1
          : defaultParams.page
        : defaultParams.page
    currentChange(page)
    getList()
  }

  // 打开新增或编辑弹窗页面
  function handleEditOpen(row, component, options, tabName) {
    comName.value = component
    dialogTitle.value =
      (options && options.title) || (!row ? t('keys.add_action') : component === 'Detail' ? t('keys.Detail') : t('keys.edit'))
    dialogWidth.value = (options && options.width) || '800px'
    rowData.value = row || null
    optionsData.value = options || null //特殊字段参数的处理
    toggleVisible(true)
    if (tabName) {
      getList()
    }
  }

  // 成功之后的回调
  function refreshTable(type) {
    if (type === 'add') {
      currentChange(1)
    }
    toggleVisible()
    getList()
  }
  // 操作头上方按钮超过四个显示更多
  function showClickOperation(command, number) {
    if (command == 1 || command == 2) {
      batchDisableEnable(command, number)
    } else {
      bacthDels()
    }
  }

  return {
    tableRefCom,
    defaultParams,
    tableData,
    loading,
    dialogVisible,
    dialogTitle,
    comName,
    dialogWidth,
    rowData,
    optionsData,
    otherParams,
    total,
    selectionRowData,
    onRowClick,
    handleSelectionChange,
    handleSizeChange,
    handleCurrentChange,
    toggleVisible,
    clearSelectionKeys,
    getList,
    searchSubmit,
    resetSubmit,
    bacthDels,
    deletePopConfirm,
    disableEnableConfirm,
    batchDisableEnable,
    handleEditOpen,
    refreshTable,
    showClickOperation, // 更多批量操作的点击方法
    isAcceptUrl, // 是否允许接受其他列表接口
    confirmLoading,
    setConfirmData // 弹框的确认提交数据（单选/多选表格的行数据）
  }
}
